/**
 * 设计一些函数，实现UNIX 下cat 命令的部分功能
 * 1. 接受一个到多个文件名作为命令行参数，将所有文件的文件名及其内容打印到屏幕；
 * 2. 如果命令行参数中有”n“，则为每一个输出行标上行号（如同cat n所做的）；
 * 3. 如果没有输入任何文件名，则默认从标准输入（键盘）读取内容，并打印读取到的内容。
*/

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int main(int argc, char **argv)
{

    if (argc < 2)
    {
        while (1)
        {
            char buff[1024] = {'\0'};
            cin >> buff;
            cout << buff << endl;
        }
    }
    else if (argc == 2 && strncmp(argv[1], "-n", strlen(argv[1])) == 0)
    {
        int i = 1;
        while (1)
        {
            char buff[1024] = {'\0'};
            cin >> buff;
            cout << i++ << " " << buff << endl;
        }
    }
    else
    {
        if (strncmp(argv[1], "-n", strlen(argv[1])) == 0)
        {
            for (int i = 2; i < argc; ++i)
            {
                int line = 1;
                string str_line;

                ifstream infile;
                infile.open(argv[i]);

                if (infile.is_open())
                {
                    while (!infile.eof())
                    {
                        getline(infile, str_line);

                        cout << line++ << " " << str_line << endl;
                    }
                }
            }
        }
        else
        {
            for (int i = 1; i < argc; ++i)
            {

                string str_line;

                ifstream infile;
                infile.open(argv[i]);

                if (infile.is_open())
                {
                    while (!infile.eof())
                    {
                        getline(infile, str_line);

                        cout << str_line << endl;
                    }
                }
            }
        }
    }

    return 0;
}
